/*
数字 n 代表生成括号的对数，请你设计一个函数，用于能够生成所有可能的并且 有效的 括号组合。
*/
#include <string>
#include <vector>
#include <iostream>

using namespace std;

class Solution {
public:
    void backtrack(vector<string>& res, string& s, int n, int open, int close) {
        if (s.size() == n * 2) {
            res.push_back(s);
            return;
        }

        // 只要左括号还没到n个，此处就可以放左括号
        if (open < n) {
            s.push_back('(');
            backtrack(res, s, n, open + 1, close);
            s.pop_back(); // open保持不变
        }

        // 只要左括号数量大于右括号数量，此处就可以放右括号
        if (open > close) {
            s.push_back(')');
            backtrack(res, s, n, open, close + 1);
            s.pop_back(); // close保持不变
        }
    }

    vector<string> generateParenthesis(int n) {
        vector<string> res;

        string s;
        backtrack(res, s, n, 0, 0);

        return res;
    }
};

int main() {
    vector<string> res = Solution().generateParenthesis(5);
    for (auto& s : res) {
        cout << s << endl;
    }
    return 0;
}